package com.dingwen.stusprboomon.util;

import com.dingwen.stusprboomon.constant.eum.ParamEnum;
import org.springframework.data.domain.Sort;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;
import java.util.function.Function;
import java.util.function.Supplier;

/**
 * 方法入参检查工具
 *
 * @author dingwen
 * 2021.06.24 09:19
 */
public class ParamCheckUtil {

    /**
     * 方法集合
     */
    private final Map<ParamEnum, Function<Object, Object>> functionMap = new HashMap<>();

    /**
     * 构造器私有化
     */
    private ParamCheckUtil() {
        init();
    }

    /**
     * 获得实例
     *
     * @return {@link ParamCheckUtil}
     */
    public static ParamCheckUtil getInstance() {
        return new ParamCheckUtil();
    }

    /**
     * 附加执行
     *
     * @param paramEnum param枚举
     * @param object    对象
     * @return {@link Object}
     */
    public Object append(ParamEnum paramEnum, Object object) {
        return functionMap.get(paramEnum).apply(object);
    }

    /**
     * 初始化
     */
    private void init() {
        functionMap.put(ParamEnum.SORT, sort -> sortCheck((Sort) sort));
        functionMap.put(ParamEnum.PAGE_NUM, pageNum -> pageNumCheck((Integer) pageNum));
        functionMap.put(ParamEnum.PAGE_SIZE, pageSize -> pageSizeCheck((Integer) pageSize));
    }


    /**
     * sort 检查
     *
     * @param sort 排序
     * @return {@link Sort}
     */
    private Sort sortCheck(Sort sort) {
        return (Sort) supplierHandle(sort, Sort.by(Sort.Direction.DESC, "_id"));
    }

    /**
     * 页面大小 检查
     *
     * @param pageSize 页面大小
     * @return {@link Integer}
     */
    private Integer pageSizeCheck(Integer pageSize) {
        return (Integer) supplierHandle(pageSize, 10);
    }

    /**
     * 页面数
     *
     * @param pageNum 页面数
     * @return {@link Integer}
     */
    private Integer pageNumCheck(Integer pageNum) {
        return (Integer) supplierHandle(pageNum, 1);
    }

    /**
     * 供应商处理
     *
     * @param currentValue 当前值
     * @param defaultValue 默认值
     * @return {@link Object}
     */
    private Object supplierHandle(Object currentValue, Object defaultValue) {
        Supplier<Object> supplier = () -> defaultValue;
        return Optional.ofNullable(currentValue).orElseGet(supplier);
    }


}
